#! /bin/bash

set -e
function info { echo -e "\e[32m[info] $*\e[39m"; }
function warn  { echo -e "\e[33m[warn] $*\e[39m"; }
function error { echo -e "\e[31m[error] $*\e[39m"; }

# Code related
ALGORITHM_REPO=`cat configmap.yaml | grep "^  algorithm.repo:" | cut -d"\"" -f2 | tr -d ' '`
GIT_REPO=`cat configmap.yaml | grep "^  code.repo:" | cut -d"\"" -f2 | tr -d ' '`
GIT_BRANCH=`cat configmap.yaml | grep "^  code.branch:" | cut -d"\"" -f2 | tr -d ' '`
# Environment config
DUBHE_ENVIRONMENT=`cat configmap.yaml | grep "^  dubhe.environment:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
# Nacos config
NACOS_SERVER=`cat configmap.yaml | grep "^  nacos.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
NACOS_PORT=`cat configmap.yaml | grep "^  nacos.port:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
NACOS_USER=`cat configmap.yaml | grep "^  nacos.mysql.user:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
NACOS_PASSWORD=`cat configmap.yaml | grep "^  nacos.mysql.password:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
# Minio config
MINIO_SERVER=`cat configmap.yaml | grep "^  minio.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
MINIO_PORT=`cat configmap.yaml | grep "^  minio.port:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
# Backend config
BACKEND_SERVER=`cat configmap.yaml | grep "^  backend.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
BACKEND_K8S_SERVER=`cat configmap.yaml | grep "^  backend.k8s.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
BACKEND_GATEWAY_SERVER=`cat configmap.yaml | grep "^  backend.gateway.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
BACKEND_DCM4CHEE_SERVER=`cat configmap.yaml | grep "^  backend.dcm4chee.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
WEB_PROXY_HOST=`cat configmap.yaml | grep "^  web.proxy.host:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
NGINX_PROXY_MINIO=`cat configmap.yaml | grep "^  elasticsearch.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
# Redis definition
REDIS_PASSWORD=`cat configmap.yaml | grep "^  redis.password:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
REDIS_SERVER=`cat configmap.yaml | grep "^  redis.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
# Web
WEB_SERVER=`cat configmap.yaml | grep "^  web.server:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`

# Image config
# Mysql
MYSQL_IMAGE=`cat configmap.yaml | grep "^  image.mysql:" | cut -d"\"" -f2`
MYSQL_INIT_IMAGE=`cat configmap.yaml | grep "^  image.mysql-init:" | cut -d"\"" -f2`
# Minio
MINIO_IMAGE=`cat configmap.yaml | grep "^  image.minio:" | cut -d"\"" -f2`
MINIO_INIT_IMAGE=`cat configmap.yaml | grep "^  image.minio-init:" | cut -d"\"" -f2`
# Nacos
NACOS_IMAGE=`cat configmap.yaml | grep "^  image.nacos:" | cut -d"\"" -f2`
NACOS_INIT_IMAGE=`cat configmap.yaml | grep "^  image.nacos-init:" | cut -d"\"" -f2`
# Redis
REDIS_IMAGE=`cat configmap.yaml | grep "^  image.redis" | cut -d"\"" -f2`
# Storage init
STORAGE_INIT_IMAGE=`cat configmap.yaml | grep "^  image.storage-init:" | cut -d"\"" -f2`
# Backend
BACKEND_IMAGE=`cat configmap.yaml | grep "^  image.backend:" | cut -d"\"" -f2`
BACKEND_INIT_IMAGE=`cat configmap.yaml | grep "^  image.backend-init:" | cut -d"\"" -f2`
BACKEND_VISUAL_IMAGE=`cat configmap.yaml | grep "^  image.backend-visual:" | cut -d"\"" -f2`
#Web
WEB_IMAGE=`cat configmap.yaml | grep "^  image.web:" | cut -d"\"" -f2`
#Alogirithm image
ALGORITHM_IMGPROCESS_IMAGE=`cat configmap.yaml | grep "^  image.imgprocess.algorithm:" | cut -d"\"" -f2`
ALGORITHM_OFRECORD_IMAGE=`cat configmap.yaml | grep "^  image.ofrecord.algorithm:" | cut -d"\"" -f2`
ALGORITHM_VIDEOSAMPLE_IMAGE=`cat configmap.yaml | grep "^  image.videosample.algorithm:" | cut -d"\"" -f2`
#MODEL
## MODEL_CONVERTER_IMAGE
MODEL_CONVERTER_IMAGE=`cat configmap.yaml | grep "^  image.converter:" | cut -d"\"" -f2`
## MODEL_MEASURING_IMAGE
MODEL_MEASURING_IMAGE=`cat configmap.yaml | grep "^  image.measuring:" | cut -d"\"" -f2`

# Storage config
STORAGE_CLASS=`cat configmap.yaml | grep "^  storage.classname:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
STORAGE_SIZE=`cat configmap.yaml | grep "^  storage.size:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`
STORAGE_PATH=`cat configmap.yaml | grep "^  storage.path:" | cut -d":" -f2 | tr -d ' ' | tr -d '"'`

ROOTDIR=`pwd`

# Build image for backend.
# Backend service such as admin is based on this image.
funcBuildImageBackend(){
    cd $ROOTDIR

    log "Start to build backend image...\n"

    cp template/bootstrap.yml image/backend/bootstrap-prod.yml
    cp template/kubeconfig.yaml image/backend/kubeconfig-prod

    sed -i "s/DUBHE_ENVIRONMENT/$DUBHE_ENVIRONMENT/g" image/backend/bootstrap-prod.yml
    sed -i "s/NACOS_SERVER/$NACOS_SERVER/g" image/backend/bootstrap-prod.yml
    sed -i "s/NACOS_PORT/$NACOS_PORT/g" image/backend/bootstrap-prod.yml
    sed -i "s/NACOS_USER/$NACOS_USER/g" image/backend/bootstrap-prod.yml
    sed -i "s/NACOS_PASSWORD/$NACOS_PASSWORD/g" image/backend/bootstrap-prod.yml

    # Copy Dubhe code.
    if [ ! -d "image/backend/Dubhe" ];then
        cp -r Dubhe image/backend/
    fi

    # In backend image directory
    cd image/backend

    cp kubeconfig-prod Dubhe/dubhe-server/common-k8s/src/main/resources/kubeconfig
    cp bootstrap-prod.yml Dubhe/dubhe-server/common-cloud/configuration/src/main/resources/

    # Compile backend with maven
    docker run --rm --entrypoint="" -v $PWD/Dubhe:/Dubhe maven:3.5-jdk-8 /bin/bash -c 'cd /Dubhe/dubhe-server/ && mvn clean compile package'

    cd Dubhe/dubhe-server

    docker build -t $BACKEND_IMAGE ./

    cd $ROOTDIR

    log "Please push image $BACKEND_IMAGE to image repo if needed\n"
}

# Build image for web.
funcBuildImageWeb(){
    cd $ROOTDIR

    log "Start to build web image...\n"
    # Just use production environment
    cp template/env.production image/web/env.production
    cp template/nginx.conf image/web/nginx.conf
    # Web service will visit minio and backend-k8s.
    if [ -z $WEB_PROXY_HOST ];then
        # Visit by domain
        sed -i "s/DUBHE_ENVIRONMENT/$DUBHE_ENVIRONMENT/g" image/web/env.production
        sed -i "s/DUBHE_BACKEND_SERVER/$BACKEND_K8S_SERVER/g" image/web/env.production
        sed -i "s/DUBHE_MINIO_SERVER/$MINIO_SERVER/g" image/web/env.production
        sed -i "s/DUBHE_MINIO_PORT/$MINIO_PORT/g" image/web/env.production
        sed -i "s/DUBHE_MINIO_SERVER/$MINIO_SERVER/g" image/web/nginx.conf
        sed -i "s/DUBHE_MINIO_PORT/$MINIO_PORT/g" image/web/nginx.conf
        sed -i "s/DUBHE_WEB_SERVER/$WEB_SERVER/g" image/web/nginx.conf
        sed -i "s/DUBHE_BACKEND_GATEWAY_SERVER/$BACKEND_GATEWAY_SERVER/g" image/web/nginx.conf
        sed -i "s/DUBHE_BACKEND_DCM4CHEE_SERVER/$BACKEND_DCM4CHEE_SERVER/g" image/web/nginx.conf
        sed -i "s/DUBHE_BACKEND_DCM4CHEE_SERVER/$BACKEND_DCM4CHEE_SERVER/g" image/web/env.production
    else
        # Visit by node proxy
        sed -i "s/DUBHE_ENVIRONMENT/$DUBHE_ENVIRONMENT/g" image/web/env.production
        sed -i "s/DUBHE_BACKEND_SERVER/$WEB_PROXY_HOST/g" image/web/env.production
        sed -i "s/DUBHE_MINIO_SERVER/$WEB_PROXY_HOST/g" image/web/env.production
        sed -i "s/DUBHE_BACKEND_DCM4CHEE_SERVER:8080/$NGINX_PROXY_MINIO:30088/g" image/web/nginx.conf
        sed -i "s/DUBHE_WEB_SERVER/$WEB_PROXY_HOST:30800/g" image/web/env.production
        sed -i "s/DUBHE_MINIO_PORT/30900/g" image/web/env.production
        sed -i "s/8960/30960/g" image/web/env.production
        sed -i "s/DUBHE_MINIO_SERVER/$NGINX_PROXY_MINIO/g" image/web/nginx.conf
        sed -i "s/DUBHE_MINIO_PORT/9000/g" image/web/nginx.conf
        sed -i "s/DUBHE_BACKEND_GATEWAY_SERVER/$BACKEND_GATEWAY_SERVER/g" image/web/nginx.conf
    fi

    # Copy Dubhe code.
    if [ ! -d "image/web/Dubhe" ];then
        cp -r Dubhe image/web/
    fi

    # In web image directory
    cd image/web

    cp env.production Dubhe/webapp/.env.production

    # Compile web image
    docker run --rm --entrypoint="" -v $PWD/Dubhe:/Dubhe node:12 /bin/bash -c 'cd /Dubhe/webapp/ &&  npm install && npm run build:prod'

    docker build -t $WEB_IMAGE ./

    cd $ROOTDIR

    log "Please push image $WEB_IMAGE to image repo if needed\n"
}

# Build image for minio initializing.
funcBuildImageMinioInit(){
    cd $ROOTDIR

    log "Start to build minio-init image...\n"

     # In web image directory
    cd image/minio-ini

    docker build -t $MINIO_INIT_IMAGE ./

    cd $ROOTDIR

    log "Please push image $MINIO_INIT_IMAGE to image repo if needed\n"
}



# Build image for Model-Converter
funcBuildImageModel-Converter(){
     cd $ROOTDIR

     log "Start to build model-converter image...\n"

     # In model-converter directory
    cd image/model-converter
    docker build -t $MODEL_CONVERTER_IMAGE ./

    cd $ROOTDIR

    log "Please push image $MODEL_CONVERTER_IMAGE to image repo if needed\n"
}

# Build image for Model-Measuring
funcBuildImageModel-Measuring(){
     cd $ROOTDIR

     log "Start to build model-measuring image...\n"

     # In model-measuring directory
    cd image/model-measuring
    docker build -t $MODEL_MEASURING_IMAGE ./

    cd $ROOTDIR

    log "Please push image $MODEL_MEASURING_IMAGE to image repo if needed\n"
}

# Build image for mysql initializing.
funcBuildImageMysqlInit(){
    cd $ROOTDIR

    log "Start to build mysql-init image...\n"

     # In web image directory
    cd image/mysql-ini

    docker build -t $MYSQL_INIT_IMAGE ./

    cd $ROOTDIR

    log "Please push image $MYSQL_INIT_IMAGE to image repo if needed\n"
}

# Build image for storage initializing.
funcBuildImageStorageInit(){
    cd $ROOTDIR

    log "Start to build storage-init image...\n"

     # In web image directory
    cd image/storage-ini

    docker build -t $STORAGE_INIT_IMAGE ./

    cd $ROOTDIR

    log "Please push image $STORAGE_INIT_IMAGE to image repo if needed\n"
}

# Build image for nacos initializing.
funcBuildImageNacosInit(){
    cd $ROOTDIR

    log "Start to build nacos-init image...\n"

     # In nacos-init image directory
    cd image/nacos-ini

    docker build -t $NACOS_INIT_IMAGE ./

    cd $ROOTDIR

    log "Please push image $NACOS_INIT_IMAGE to image repo if needed\n"
}

# Build image for backend initializing.
funcBuildImageBackendInit(){
    cd $ROOTDIR

    log "Start to build backend-init image...\n"

     # In backend-init image directory
    cd image/backend-ini

    docker build -t $BACKEND_INIT_IMAGE ./

    cd $ROOTDIR

    log "Please push image $BACKEND_INIT_IMAGE to image repo if needed\n"
}
funcBuildImageVisualServer(){
    cd $ROOTDIR

    log "Start to build visual-server image...\n"

     # In backend-init image directory
    cd image/visual-server

    docker build -t $BACKEND_VISUAL_IMAGE ./

    cd $ROOTDIR

    log "Please push image $BACKEND_VISUAL_IMAGE to image repo if needed\n"
}

# Build images for all images.
# Or build a certain image.
build-image(){
    image=$1

    # 如果当前文件夹不存在Dubhe文件夹, 会去GIT上拉取源码
    if [ ! -d "Dubhe" ];then
        git clone $GIT_REPO -b $GIT_BRANCH
    fi

    # 编译镜像
    case "$image" in
        all)
            funcBuildImageMysqlInit
	    funcBuildImageMinioInit
	    funcBuildImageNacosInit
#	    funcBuildImageStorageInit
	    funcBuildImageBackendInit
#            funcBuildImageVisualServer
#            funcBuildImageBackend
            funcBuildImageWeb
#            funcBuildImageModel-Converter
#            funcBuildImageModel-Measuring
        ;;
        mysql-init)
            funcBuildImageMysqlInit
        ;;
        minio-init)
            funcBuildImageMinioInit
        ;;
        nacos-init)
            funcBuildImageNacosInit
        ;;
        backend)
            funcBuildImageBackend
        ;;
        visual-server)
            funcBuildImageVisualServer
        ;;
        backend-init)
            funcBuildImageBackendInit
        ;;
        storage-init)
            funcBuildImageStorageInit
        ;;
        model-converter)
            funcBuildImageModel-Converter
	;;
        model-measuring)
            funcBuildImageModel-Measuring
        ;;
        web)
            funcBuildImageWeb
        ;;
    esac
}

# Create kubeconfig configmap
createKubeConfigmap() {
    cd $ROOTDIR
    kubectl create configmap -n dubhe-system kubeconfig --from-file template/kubeconfig.yaml
    cd $ROOTDIR
}

# Install all components.
# TODO: Remove algorithm
install() {
    cd $ROOTDIR
    rm -rf target
    mkdir target
    cp -r ./template/yaml target/
    cp -r ./template/algorithm target/
    # Mysql service
    sed -i "s!MYSQL_IMAGE!$MYSQL_IMAGE!g" target/yaml/mysql.yaml
    # Minio Service
    sed -i "s!MINIO_IMAGE!$MINIO_IMAGE!g" target/yaml/minio.yaml
    # Nacos Service
    sed -i "s!NACOS_IMAGE!$NACOS_IMAGE!g" target/yaml/nacos.yaml
    # Redis service
    sed -i "s!REDIS_IMAGE!$REDIS_IMAGE!g" target/yaml/redis.yaml
    sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/yaml/redis.yaml
    # Backend service
    # Currently, Backend service just do initializing work for backend components.
    sed -i "s!MYSQL_INIT_IMAGE!$MYSQL_INIT_IMAGE!g" target/yaml/backend.yaml
    sed -i "s!MINIO_INIT_IMAGE!$MINIO_INIT_IMAGE!g" target/yaml/backend.yaml
    sed -i "s!NACOS_INIT_IMAGE!$NACOS_INIT_IMAGE!g" target/yaml/backend.yaml
    sed -i "s!STORAGE_INIT_IMAGE!$STORAGE_INIT_IMAGE!g" target/yaml/backend.yaml
    sed -i "s!BACKEND_IMAGE!$BACKEND_IMAGE!g" target/yaml/backend*.yaml
    sed -i "s!BACKEND_INIT_IMAGE!$BACKEND_INIT_IMAGE!g" target/yaml/backend*.yaml
    sed -i "s!BACKEND_VISUAL_IMAGE!$BACKEND_VISUAL_IMAGE!g" target/yaml/backend-visual.yaml
    sed -i "s!DUBHE_REDIS_SERVER!$REDIS_SERVER!g" target/yaml/backend-visual.yaml
    sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/yaml/backend-visual.yaml
    sed -i "s!DUBHE_DUBHE_ENVIRONMENT!$DUBHE_ENVIRONMENT!g" target/yaml/backend*.yaml
    # Algorithim
    sed -i "s!ALGORITHM_IMGPROCESS_IMAGE!$ALGORITHM_IMGPROCESS_IMAGE!g" target/algorithm/algorithm-imgprocess.yaml
    sed -i "s!ALGORITHM_OFRECORD_IMAGE!$ALGORITHM_OFRECORD_IMAGE!g" target/algorithm/algorithm-ofrecord.yaml
    sed -i "s!ALGORITHM_VIDEOSAMPLE_IMAGE!$ALGORITHM_VIDEOSAMPLE_IMAGE!g" target/algorithm/algorithm-videosample.yaml
    sed -i "s!DUBHE_REDIS_SERVER!$REDIS_SERVER!g" target/algorithm/*.yaml
    sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/algorithm/*.yaml
    sed -i "s!BACKEND_INIT_IMAGE!$BACKEND_INIT_IMAGE!g" target/algorithm/*.yaml
    # Web service
    sed -i "s!WEB_IMAGE!$WEB_IMAGE!g" target/yaml/web.yaml
    #MODEL
    ## MODEL_CONVERTER_IMAGE
    sed -i "s!MODEL_CONVERTER_IMAGE!$MODEL_CONVERTER_IMAGE!g" target/yaml/backend-model-converter.yaml
    ## MODEL_MEASURING_IMAGE
    sed -i "s!MODEL_MEASURING_IMAGE!$MODEL_MEASURING_IMAGE!g" target/yaml/backend-model-measure.yaml

    # 单节点使用hostpath存储
    if [ $STORAGE_CLASS = "hostpath" ];then
        rm target/yaml/pvc.yaml
        # Create storage dir
        mkdir -p $STORAGE_PATH/dubhe-storage
        mkdir -p $STORAGE_PATH/mysql-storage
        mkdir -p $STORAGE_PATH/redis-storage
        mkdir -p $STORAGE_PATH/nacos-storage
        mkdir -p $STORAGE_PATH/dcm4chee-arc
        # Replace pvc with hostpath
        sed -i "s!persistentVolumeClaim:!hostPath:!g" target/yaml/*.yaml
        sed -i "s!claimName: dubhe-storage!path: $STORAGE_PATH/dubhe-storage!g" target/yaml/*.yaml
        sed -i "s!claimName: mysql-storage!path: $STORAGE_PATH/mysql-storage!g" target/yaml/*.yaml
        sed -i "s!claimName: nacos-storage!path: $STORAGE_PATH/nacos-storage!g" target/yaml/*.yaml
        sed -i "s!claimName: redis-storage!path: $STORAGE_PATH/redis-storage!g" target/yaml/*.yaml
        sed -i "s!claimName: dcm4chee-arc!path: $STORAGE_PATH/dcm4chee-arc!g" target/yaml/*.yaml
        sed -i "s!persistentVolumeClaim:!hostPath:!g" target/algorithm/*.yaml
        sed -i "s!claimName: dubhe-storage!path: $STORAGE_PATH/dubhe-storage!g" target/algorithm/*.yaml
    else
        # Volumes
        sed -i "s/STORAGE_CLASS/$STORAGE_CLASS/g" target/yaml/pvc.yaml
        sed -i "s/STORAGE_SIZE/$STORAGE_SIZE/g" target/yaml/pvc.yaml
    fi

    log "Start to deploy Dubhe system.\n"
    # Create namespace and configmap for dubhe.
    kubectl create -f namespace.yaml
    kubectl create -f configmap.yaml
    # Create kubeconfig configmap
    createKubeConfigmap
    # Create all services defined in template/yaml dir.
    kubectl create -f target/yaml/
    kubectl create -f target/algorithm/
    log "Please wait all pod to be running with:\n"
    log "kubectl get po -n dubhe-system -w\n"
}

reinstall() {
    cd $ROOTDIR
    module=$1
    # Deploy one algorithm service.
    if [[ $module == algorithm-* ]];then
        mkdir -p target/algorithm
        cp ./template/algorithm/$module.yaml ./target/algorithm
        sed -i "s!ALGORITHM_IMGPROCESS_IMAGE!$ALGORITHM_IMGPROCESS_IMAGE!g" target/algorithm/algorithm-imgprocess.yaml
        sed -i "s!ALGORITHM_OFRECORD_IMAGE!$ALGORITHM_OFRECORD_IMAGE!g" target/algorithm/algorithm-ofrecord.yaml
        sed -i "s!ALGORITHM_VIDEOSAMPLE_IMAGE!$ALGORITHM_VIDEOSAMPLE_IMAGE!g" target/algorithm/algorithm-videosample.yaml
        sed -i "s!DUBHE_REDIS_SERVER!$REDIS_SERVER!g" target/algorithm/$module.yaml
        sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/algorithm/$module.yaml
        sed -i "s!BACKEND_INIT_IMAGE!$BACKEND_INIT_IMAGE!g" target/algorithm/$module.yaml

        if [ $STORAGE_CLASS = "hostpath" ];then
            # Replace pvc with hostpath
            sed -i "s!persistentVolumeClaim:!hostPath:!g" target/algorithm/$module.yaml
            sed -i "s!claimName: dubhe-storage!path: $STORAGE_PATH/dubhe-storage!g" target/algorithm/$module.yaml
        fi

        kubectl delete -f target/algorithm/$module.yaml --ignore-not-found=true
        kubectl create -f target/algorithm/$module.yaml
      	return 0
    fi

    # Deploy all algorithm services.
    if [[ $module == algorithm ]];then
        mkdir -p target/algorithm
        cp ./template/algorithm/*.yaml ./target/algorithm
      	sed -i "s!ALGORITHM_IMGPROCESS_IMAGE!$ALGORITHM_IMGPROCESS_IMAGE!g" target/algorithm/algorithm-imgprocess.yaml
        sed -i "s!ALGORITHM_OFRECORD_IMAGE!$ALGORITHM_OFRECORD_IMAGE!g" target/algorithm/algorithm-ofrecord.yaml
        sed -i "s!ALGORITHM_VIDEOSAMPLE_IMAGE!$ALGORITHM_VIDEOSAMPLE_IMAGE!g" target/algorithm/algorithm-videosample.yaml
        sed -i "s!DUBHE_REDIS_SERVER!$REDIS_SERVER!g" target/algorithm/*.yaml
        sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/algorithm/*.yaml
      	sed -i "s!BACKEND_INIT_IMAGE!$BACKEND_INIT_IMAGE!g" target/algorithm/*.yaml

        if [ $STORAGE_CLASS = "hostpath" ];then
            # Replace pvc with hostpath
            sed -i "s!persistentVolumeClaim:!hostPath:!g" target/algorithm/*.yaml
            sed -i "s!claimName: dubhe-storage!path: $STORAGE_PATH/dubhe-storage!g" target/algorithm/*.yaml
        fi

      	algorithm_list=("imgprocess" "ofrecord" "videosample")
        for algorithm in ${algorithm_list[*]}
        do
            echo "Start to deploy algorithm $algorithm..."
            file="algorithm-${algorithm}.yaml"
            kubectl delete -f target/algorithm/$file --ignore-not-found=true
            kubectl create -f target/algorithm/$file
        done
        return 0
    fi

    # Deploy aone backend service.
    mkdir -p target/yaml
    log "Start to reinstall module $module\n"
    cp ./template/yaml/$module.yaml ./target/yaml/
    # Just replace all keywords defined in install() func.
    sed -i "s!MYSQL_IMAGE!$MYSQL_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!MINIO_IMAGE!$MINIO_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!NACOS_IMAGE!$NACOS_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!REDIS_IMAGE!$REDIS_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!DUBHE_REDIS_SERVER!$REDIS_SERVER!g" target/yaml/$module.yaml
    sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/yaml/$module.yaml
    sed -i "s!MYSQL_INIT_IMAGE!$MYSQL_INIT_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!MINIO_INIT_IMAGE!$MINIO_INIT_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!NACOS_INIT_IMAGE!$NACOS_INIT_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!STORAGE_INIT_IMAGE!$STORAGE_INIT_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!BACKEND_IMAGE!$BACKEND_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!BACKEND_INIT_IMAGE!$BACKEND_INIT_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!BACKEND_VISUAL_IMAGE!$BACKEND_VISUAL_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!WEB_IMAGE!$WEB_IMAGE!g" target/yaml/$module.yaml
    sed -i "s!DUBHE_DUBHE_ENVIRONMENT!$DUBHE_ENVIRONMENT!g" target/yaml/$module.yaml
    ## MODEL_CONVERTER_IMAGE
    sed -i "s!MODEL_CONVERTER_IMAGE!$MODEL_CONVERTER_IMAGE!g" target/yaml/$module.yaml
    ## MODEL_MEASURING_IMAGE
    sed -i "s!MODEL_MEASURING_IMAGE!$MODEL_MEASURING_IMAGE!g" target/yaml/$module.yaml

    if [ $STORAGE_CLASS = "hostpath" ];then
        # Replace pvc with hostpath
        sed -i "s!persistentVolumeClaim:!hostPath:!g" target/yaml/$module.yaml
        sed -i "s!claimName: dubhe-storage!path: $STORAGE_PATH/dubhe-storage!g" target/yaml/$module.yaml
        sed -i "s!claimName: mysql-storage!path: $STORAGE_PATH/mysql-storage!g" target/yaml/$module.yaml
        sed -i "s!claimName: nacos-storage!path: $STORAGE_PATH/nacos-storage!g" target/yaml/$module.yaml
        sed -i "s!claimName: redis-storage!path: $STORAGE_PATH/redis-storage!g" target/yaml/$module.yaml
        sed -i "s!claimName: dcm4chee-arc!path: $STORAGE_PATH/dcm4chee-arc!g" target/yaml/$module.yaml
    fi

    kubectl delete -f target/yaml/$module.yaml --ignore-not-found=true
    kubectl create -f target/yaml/$module.yaml

    # Backend components list
    backend_components=("admin" "algorithm" "auth" "data-dcm" "data-task" "data" "gateway" "image" "k8s" \
	    "measure" "model" "notebook" "optimize" "serving-gateway" "serving" "tadl" "train" "visual" \
	    "terminal" "dcm4chee" "point-cloud")

    # Reinstall all backend components because nacos config may be changed.
    if [ $module = "backend" ];then
        cp ./template/yaml/backend-*.yaml ./target/yaml/
        sed -i "s!BACKEND_IMAGE!$BACKEND_IMAGE!g" target/yaml/backend-*.yaml
        sed -i "s!BACKEND_INIT_IMAGE!$BACKEND_INIT_IMAGE!g" target/yaml/backend-*.yaml
        sed -i "s!BACKEND_VISUAL_IMAGE!$BACKEND_VISUAL_IMAGE!g" target/yaml/backend-*.yaml
        sed -i "s!DUBHE_REDIS_SERVER!$REDIS_SERVER!g" target/yaml/backend-*.yaml
        sed -i "s!DUBHE_REDIS_PASSWORD!$REDIS_PASSWORD!g" target/yaml/backend-*.yaml
        if [ $STORAGE_CLASS = "hostpath" ];then
            # Replace pvc with hostpath
            sed -i "s!persistentVolumeClaim:!hostPath:!g" target/yaml/backend-*.yaml
            sed -i "s!claimName: dubhe-storage!path: $STORAGE_PATH/dubhe-storage!g" target/yaml/backend-*.yaml
            sed -i "s!claimName: dcm4chee-arc!path: $STORAGE_PATH/dcm4chee-arc!g" target/yaml/backend-*.yaml
        fi
        for component in ${backend_components[*]}
        do
            file="backend-${component}.yaml"
            echo $file
            kubectl delete -f target/yaml/$file --ignore-not-found=true
            kubectl create -f target/yaml/$file
             # echo -ne `warn`"后端reinstall，前端请执行reinstall"
             # echo -ne `warn`"./dubhectl reinstall web"
        done
    fi
}

uninstall() {
    kubectl delete ns dubhe-system
    log "Namespace dubhe-system is removed\n"
    log "Please remove user namespaces manually\n"
}

usage() {
	log "Usage: \n"
	echo -ne "\t$0 build-image all(mysql-init|minio-init|nacos-init|backend-init|storage-init|backend|web|visual-server|model-converter|model-measuring)\n"
	echo -ne "\t$0 install\n"
	echo -ne "\t$0 reinstall module(mysql|nacos|minio|redis|backend|web)\n"
	echo -ne "\t$0 uninstall\n"
	exit 0
}

err() {
	echo -ne `error`$* 1>&2
}

log() {
	echo -ne `info`$* >&1
}

op=$1

shift

case "$op" in
    build-image)
        build-image $*
        ;;
    install)
        install
        ;;
    reinstall)
        reinstall $*
        ;;
    uninstall)
        uninstall
        ;;
    -h|--help)
        usage
        ;;
    *)
        usage
        exit 0
esac
